from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse 
# 导入 TaggableManager 类，用于在模型中实现标签功能
from taggit.managers import TaggableManager


# 自定义模型管理器 PublishedManager
class PublishedManager(models.Manager):
    def get_queryset(self):
        return super(PublishedManager, self).get_queryset().filter(status='published')

class Post(models.Model):
    def get_absolute_url(self):
        return reverse('blog:post_detail',args=[self.publish.year,self.publish.month,self.publish.day,self.slug])
    # 重新创建初始模型管理器，确保初始模型管理器可用
    objects = models.Manager()
    # 使用自定义模型管理器 PublishedManager 类创建一个管理器实例
    published = PublishedManager()
    # 实现按标签筛选文章的功能，方便用户查找相关主题的文章。
    tags = TaggableManager()


    STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('published', 'Published')
    )

    title = models.CharField(max_length=250)
    body = models.TextField()
    slug = models.SlugField(max_length=250, unique_for_date='publish')
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='author')
    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')

    class Meta:
        ordering = ('-publish',)

    def __str__(self):
        return self.title


# 评论模型，用于存储与帖子相关的评论信息
class Comment(models.Model):       #当帖子被删除时，相关联的评论也会被删除。 #通过帖子的模型，可以找到所有属于这个帖子的评论。
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')  # 与帖子模型建立外键关系，表示该评论属于哪个帖子。
    name = models.CharField(max_length=80)  # 评论者姓名
    email = models.EmailField()  # 评论者邮箱
    body = models.TextField()  # 评论内容
    created = models.DateTimeField(auto_now_add=True)  # 评论的创建时间，自动设置为当前时间。
    updated = models.DateTimeField(auto_now=True)  # 评论的最后更新时间，每次保存模型实例时自动更新。
    active = models.BooleanField(default=True)  # 评论是否激活

    class Meta:
        # 指定模型的默认排序方式，按照创建时间升序排列
        ordering = ('created',)

    def __str__(self):
        # 返回模型的字符串表示，格式为：'Comment by [评论者姓名] on [评论的帖子标题]'
        # 这里假设模型有两个字段：name（评论者姓名）和post（评论的帖子）
        return f'Comment by {self.name} on {self.post}'

